import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False

def simple_gradient_descent():
    """梯度下降法简单示例：寻找函数 y = (x-3)^2 的最小值"""
    
    # 定义损失函数和梯度函数
    def loss_function(x):
        return (x - 3)**2
    
    def gradient(x):
        return 2 * (x - 3)
    
    # 初始化参数
    x = 0.0  # 初始位置
    learning_rate = 0.1  # 学习率（步长）
    iterations = 15  # 迭代次数
    path = []  # 记录路径
    
    print("梯度下降过程：")
    print("迭代次数 | 当前位置 | 损失值 | 梯度")
    print("-" * 40)
    
    for i in range(iterations):
        current_loss = loss_function(x)
        current_gradient = gradient(x)
        path.append((x, current_loss))
        
        # 更新位置：新位置 = 旧位置 - 学习率 × 梯度
        x = x - learning_rate * current_gradient
        
        print(f"{i+1:^8} | {x:^8.3f} | {current_loss:^6.3f} | {current_gradient:^5.2f}")
    
    # 可视化优化过程
    x_vals = np.linspace(-1, 7, 100)
    y_vals = loss_function(x_vals)
    
    plt.figure(figsize=(10, 6))
    plt.plot(x_vals, y_vals, 'b-', label='损失函数')
    path_x, path_y = zip(*path)
    plt.plot(path_x, path_y, 'ro-', label='优化路径')
    plt.xlabel('参数值')
    plt.ylabel('损失值')
    plt.title('梯度下降优化过程')
    plt.legend()
    plt.grid(True)
    plt.show()
    
    return path

# 运行示例
path = simple_gradient_descent()